Machine Learning

Del Notebook Lab a Produccion

Quien Soy

German Bourdin - Technical Leader @ Machinalis MercadoLibre

Soy German Bourdin, tengo 29 años

  • Vivo en Bariloche (Si hay alguien de alla que haya venido a la pycon, busqueme despues)
  • Mas o menos programo hace una bocha, a los 8 mi viejo me se canso de verme jugar a los jueguitos y me revoleo un manual de basic por la cabeza, y ahi arrancamos. Hice cosas que hoy me dan un poco de verguenza y cosas que hoy no me creo ni yo que haya hecho, progame en basic, visual basic, php, C, haskell, javascript y desde el 2012 mas o menos, casi exclusivamente en python.
  • Empece a trabajar en la industria en 2007, como tester de videojuegos y hace desde el 2013 que trabajo en Machinalis.
  • En Machinalis trabaje en proyectos web, como dev de backend, frontend, me puse un sombrero que decia devops un tiempo, etc
  • Hoy trabajo en Machinalis que hoy es parte del equipo de MercadoLibre como technical leader (que basicamente significa que voy a reuniones para que el resto no tengan que ir, discuto con algun manager, reviso codigo, escribo documentacion y cuando me queda tiempo, tambien programo) con un equipo enfocado a proveer soluciones de Machine Learning.

De donde vengo

Machinalis

  • Complex Web
  • Data Science
  • Machine Learning
  • Machine Learning para Fintech e E-Commerce

MercadoLibre

  • Platarforma de E-Commerce mas grande de America Latina
  • Mucho de lo mismo que veniamos haciendo pero varias veces mas grande
  • Vengo de una empresa que hacia machine learning y nos sumamos a una de las empresas de ecommerce mas grandes de la region a seguir haciendo machine learning.
  • Pero, yo vengo de un background web, con poca experiencia en ML, pongo esto? Editalo mejor despues

Intro

Machine Learning, es uno de los temas mas populares de los ultimos 10 años y sigue en aumento

Intro

Python es el termino mas buscado junto a machine learning en los ultimos años

  • En este contexto, estamos en el lugar correcto, python es probablemente el lenguaje mas popular para hacer desarrollos e investigacion con ML
  • Tenemos un monton de herramientas y frameworks disponibles y cada vez son mas
  • Hay muchisimos recursos, cursos, tutoriales, charlas, etc centrados en tecnicas de ML, como usar herramientas, etc
  • Hay competencias, empresas, etc patrocinando y buscando que esto crezca
  • Es natural que a todos cuando vemos estas cosas nos despierte un curiosidad saber mas

Intro

Basicamente

Intro

Como ir de esto:

Intro

A esto:

Overview

Disclaimers

  • Esta no es una charla de machine learning

Disclaimers

  • Esta no es una charla de machine learning
  • No soy data scientist
  • Hay mucho código de soporte de la charla, la idea no era construir los mejores predictores si no mostrar como llevar eso a producción, asi que no esperen que sean precisos
  • La mayoria de lo que diga, es una serie de recomendaciones, no hablo en absolutos

El notebook

  • Es una herramienta de experimentación y exploración
  • Es documentación
  • A veces deja registro de varios experimentos y cosas que en el camino no anduvieron
  • En el mejor de los casos, hace una sola cosa

El Notebook

En general, si estamos experimentando vamos a tener mas o menos las siguientes etapas en nuestro notebook:

  • Análisis y limpieza de datos
  • Definicion/configuracion del modelo
  • Training
  • Predicción
  • Evaluación

Probablemente con varias iteraciones de los últimos pasos hasta que llegamos a un modelo que nos convence

Demo Time!

Bah, les muestro un par de notebooks asi nomás

Modelado de modelos ?

Saliendo del notebook, hay tareas que nos van a seguir interesando hacer con nuestro modelo y tareas que ya no tanto.

  • Analisis de datos -> Y no, la verdad que no
  • Limpieza de datos -> A menos que vaya a entrenar de nuevo, no
  • Definicion/Configuracion del modelo -> Si
  • Training -> Si
  • Predicciones -> SI!
  • Evaluacion -> Y, no, la verdad que no (ya lo hicimos en otro lado, no voy a estar re-evaluando a cada rato)

Modelado de modelos

A las cosas que ya veniamos haciendo, le agregaria la posibilidad de cargar y restaurar entrenamientos anteriores

  • dump
  • load

Modelado de modelos

Proponemos una interfaz standard para estas cosas. Basada en la interfaz de scikit-learn + dump y load. Provee justo lo básico que esperamos de un "coso que predice", es suficientemente facil de extender y la mayoria de los que hacen DS/ML estan familiarizados con esa interfaz.

Interfaz Propuesta


In [1]:
from abc import ABCMeta, abstractmethod
class BaseModel(metaclass=ABCMeta):
    @abstractmethod
    def predict(self, X):
        passs

    @abstractmethod
    def fit(self, X, y):
        pass

    def dump(self, path):
        """
        Dumps the current trained model to path
        """
        pass

    @classmethod
    def load(cls, path):
        """
        Load saved model from path.
        """
        pass

Packages - Libraries

  • No necesitas ser Jose Tensorflow para desarrollar un paquete en python
  • No es necesario que lo publiques en pypi para instalarlo
  • Pero dependiendo del tamaño de tu infraestructura, tal vez podes tener un pypi privado y publicar ahi!
  • Los modelos de machine learning pueden pensarse como cosas reusables, no necesariamente va a servir solo para este proyecto, no necesariamente va a solamente servirse desde la app X
  • Hacer una libreria pip instalable en lugar de tener un archivo que pones en el path de tu proyecto cuando lo necesitas lleva, nada de esfuerzo extra y tiene muchos beneficios

Packages - Libraries

Hiciste tu predictor pip instalable, de paso te aseguraste:

  • De listar todas las dependencias
  • Que este documentado claro como se instala en otros entornos
  • Si tenias command line scripts, los podes agregar al path y eso queda lindo!
  • Ahhh y si querés pegar la vuelta, ahora podes importar desde un notebook tu modelo entero configurado y hacer metricas sobre eso limitandote solo a hacer análisis

Packages - Libraries

Y ya que estamos, pensemos en este punto en hacer tests!

Va mas allá de lo que voy a llegar a hablar en esta charla, pero primero, les permite ser los primeros usuarios de sus propios modelos.

Segundo, hay muchas cosas para obligarse a pensar en este sentido.

Demo Time!

Armando una API Rest para servir modelos

Ya tenemos nuestro predictor instalable, ya esta testeado dumpeamos y cargamos el modelo donde queremos, pero todavía lo estamos usando nosotros solos. Que como solucionamos esto?

  • REST es mas o menos standard para comunicar micro-servicios
  • Nos permite tener una capa agnostica del lenguaje con nuestro cosumidor (no necesariamente estamos proveyendo servicios a una web, no necesariamente el consumidor esté escrito tambien en python, etc)
  • Tenemos herramientas para armar y servir agregando una capa muy finita arriba de nuestro modelo

Flask + FlaskRESTPlus

  • Descripcion de flask (microframework y eso)
  • Descripcion de flaskRestPlus

Demo de Código!

Armando una API Rest para servir modelos

Por que separar la api del predictor?

  • Modularidad, no es poco normal que cambiemos el modelo, la api en general va a cambiar poco
  • Distintos concerns, en general en la API vamos a enfocarnos mas en temas de como se serializan los datos, de performance, de seguridad, etc
  • Podemos decidir que una API Rest no es lo que necesitamos y solamente tirar esa parte del proyecto
  • Podemos decidir usar otra tecnologia para servir y no afectar al modelo con el que estamos trabajando

Armando una API Rest para servir modelos

Por que no Django + DRF?

Por que no tensorflow serving?

Por que no Falcon?

Por que no el microframework de la semana?

Armando una API Rest para servir modelos

Q: Los microservicios son una buena idea para conseguirte dolores de cabeza gratis, por qué no lo integrás todo con tu sistema existente?

A: Hablemos mas de esto despues, pero en general, los sistemas que sirven modelos de machine learning suelen necesitar prestar atencion a cosas muy distintas a por ejemplo un sitio de clasificados tradicional, donde el tiempo que vas a pasar esperando, en general va a ser de latencia de red o de disco y podes hacer cosas con el CPU mientras esperas.

Demo Time!

Implementación de las APIs de los ejemplos!

El Frontend

Siguen las demos!

El frontend

Descubrimos que mi predictor de precios de casas, está roto y tengo hasta despues del partido para arreglarlo antes de que mi prima me mate.

Veamos como reemplazar el modelo en 5 minutos (por uno que ande menos mal)

Live Coding! Nada puede salir mal!

Extras

Algunas cosas para tener cuidado

ThreadSafety

Hay muchas herramientas para construir modelos de Machine Learning, que no son threadsafe, xgboost por ejemplo aclara que el predict de los modelos que construye tiene este problema.

Esto es, no puede ejecutarse en muchos threads al mismo tiempo, y si eso ocurre, no garantizan que funcione o que funcione bien. A la hora de configurar servidores para modelos de ese tipo, hay que tenerlo en cuenta, es una buena idea aclararlo en nuestros READMEs!

Extras

Algunas cosas para tener cuidado

Lazy Loading

Otra cosa que suele pasar con algunas de las herramientas mas comunes, es que generan cosas en memoria que no son serializables o que no pueden compartirse entre distintos procesos. Es el caso de TensorFlow entre otros, donde las sesiones no se pueden compartir y algunas cosas de los modelos no son serializables.

Para evitar problemas con esto, conviene habilitar el "lazy load" en la config de uwsgi. Por defecto uwsgi antes de forkear los workers carga la app en memoria y hace algo de inicializacion, eso ayuda a que el footprint en memoria sea mas chico. Para cosas como tensorflow, queremos que pase exactamente lo opuesto.

Extras

Algunas cosas para tener cuidado

Cuidado con el GIL

Usar threads para aumentar el throughput the una aplicacion web suele ser tentador, tengan en cuenta sin embargo, a la hora de configurar un servidor para modelos de Machine Learning que lo mas probable es que su cuello de botella sea en CPU: ie, sus procesos no pierden tiempo buscando cosas del disco o esperando a la red, estan usando el CPU para hacer calculos. Por como funciona el GIL, agregarle mas threads a esto, lo unico que va a conseguir es aumentar la latencia de todos los threads que estan compartiendo el interprete!

Usen procesos en su configuracion, apunten a no mas de uno por CPU y tuneen desde ahi

Extras

Métricas, que cosas mirar

Más allá de los clásicos precission, recall, etc, que cosas queremos ver de los modelos que estamos sirviendo

Métricas, que cosas mirar

Latencia y tiempos de respuesta

No suele ser un tema menor cuanto tiempo tarda en responder un modelo, antes de poner algo en produccion, si van a tener requerimientos sobre esto, hacer benchmarks y load tests del modelo solo y del modelo montado sobre el servidor para al menos entender como se comporta. Tener una idea de con que volumen de requests vamos a empezar a encolar pedidos en lugar de responder enseguida y cuanto vamos a tener que escalar para satisfacer los requerimientos.

Métricas, que cosas mirar

Uso del CPU

De nuevo, hagan experimentos con carga similar a la que esperan de produccion, observen, aunque sea de la forma más rustica la carga y el nivel de uso del CPU. Algunas librerias llaman a rutinas en C que se escapan de las limitaciones de python y usan threads o forkean para usar 2, 4, 8 o TODOS los cpus disponibles. Si esto les pasa, en seguida van a notar que aunque tengan 1 servidor cada 2 CPUs, si hay requests contestandose en paralelo, la performance de todas va a estar degradada. Enterensé lo antes posible de esto, tomen medidas para evitarlo.

Memoria

Si van a estar cargando modelos grandes en memoria, tengan en cuenta cuanta hay disponible, no quieren irse a swap (o que los mate el OOM)

Métricas, que cosas mirar

Resultados de las predicciones y su distribución

Esto no se cae tan de maduro, pero, antes de poner algo en produccion, solemos tener idea de como performa contra datos productivos que teniamos ejecutado. Con los datos que estemos prediciendo una vez que vayamos a produccion, a menos que tengamos un loop donde los datos lo mismo se revisen y etiqueten a mano, solamente tenemos la estadística de como suelen estar compuestos.

Si por ejemplo, hicieron un detector de panchos, y en las muestras que tomaron de produccion, el 20% de las imagenes tenian panchos, monitoreen sus resultados, si en testing tenian buenas metricas pero en produccion de repente pasan a detectar que el 80% de las imagenes estan teniendo panchos, o estamos sufriendo una invasion de vendedores de panchos o estamos por algun motivo devolviendo falsos positivos.

Si pueden, monitoreen de forma automatica, si no, al menos colecten los logs y parseen de vez en cuando!

Extras

Performance Tweaks

Algunas cosas que se pueden hacer si estamos teniendo tiempos de respuesta poco aceptables o se nos encolan muchos requests, etc. Es una lista incompleta y son recursos para considerar cuando ya otras cosas fallaron.

Premature optimization is the root of all evil!

Performance Tweaks

Buffering

Algo que suele pasar por la naturaleza de los algotimos que hay debajo (aunque no siempre es el caso, midanlo si estan en esta situación) es que hacer una prediccion para 1 dato o para 50 lleva el mismo o casi el mismo tiempo.

Ejemplo: Supongamos que obtener el precio sugerido de una casa me lleva 100ms, y el de 10 casas juntas me lleva 150ms, si predijera en serie 10 pedidos que entran juntos, el primero va a tardar 100ms, el segundo 200, el ultimo 1000ms.

Un posible tweak que se puede meter acá es una ventana que junte requests y cada X ms mande a ejecutar, es complejo de implementar pero ayuda a reducir la latencia media en estos casos. No quiero dar ejemplos puntuales porque es complicado y hay que tunearlo mucho.

Performance Tweaks

Caching

El universo de cosas que tenes que predecir es finito y acotado?

Respondes muchas veces la misma pregunta?

Tiene sentido tener pre-calculados los resultados para estos casos?

Preguntas?

Agradecimientos

  • A pyar y a la organizacion
  • A los sponsors
  • @elnassto por el frontend para el predictor de propiedades

Recursos

  • Slides
  • Ejemplos
  • Cookiecutters

Todo disponible en https://github.com/gbourdin/charlas/

Cierre

During a conversation I had with Peter Norvig, Norvig quoted a friend of him who said:

“Machine Learning development is like the raisins in a raisin bread: 1. You need the bread first 2. It’s just a few tiny raisins but without it you would just have plain bread.”

Marcos Sponton - Don't Buy Machine Learning (2016)

Esta es una cita que me gusta mucho, cuenta la leyenda que se la decia Peter Norvig, al jefe del area de R&D de Machinalis hace algunos años. Y es algo que resuena mucho conmigo y es uno de los disparadores de que venga a hablarles hoy aca.

Desarrollar soluciones de Machine Learning para la industria, es una parte chiquita de llevar soluciones a los usuarios, en particular, hacer solamente la parte de ciencia, nos deja muy lejos de los usuarios, si no lo transformamos en un producto, lo único con lo que nos quedamos son con un monton de notebooks con resultados bonitos que sirven para escribir un blogpost, para publicar un paper, para dar una charla en una pycon o para mostrarle a tus amigos, pero lejos estan de ser algo que los usuarios puedan consumir.